<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>高阶函数_函数柯里化-优化代码</title>
</head>

<body>
    <!--准备好一个容器-->
    <div id="test"></div>
    <!--引入核心库-->
    <script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
    <!--引入react-dom支持react操纵dom-->
    <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
    <!--引入babel用于将jsx转为js-->
    <script src="../js/babel.min.js"></script>
    <!--引入prop-types,用于对标签属性进行限制-->
    <script src="../js/prop-types.js">//引入之后全局会产生一个PropType对象</script>

    <script type="text/babel">
        //创建组件
        class Login extends React.Component {

            //初始化状态
            state = {
                username: '',//用户名
                password: ''//密码
            }

            //保存表单数据到状态中
            saveFormData = (dataType) => {//自定义的参数代表接收到的数据种类
                //this.setState({ username: event.target.value })//这一步表示将事件对象的值存入状态中
                return (event) => {//event是react中接收事件状态的对象 由react自动生成
                    this.setState({ [dataType]: event.target.value })
                }
            }

            //表单提交的回调
            handleSubmit = (event) => {
                event.preventDefault()//阻止表单提交
                const { username, password } = this.state//因为在状态中存了值所以要直接从状态中解构赋值
                alert(`用户名为:${username},密码为:${password}`)//直接取到的是值而不是实例对象
            }
            render() {//如果方法加小括号代表立即执行 如果{saveFormData('username')}以这种方式去写 会让event接收到username本身
                return (
                    <form onSubmit={this.handleSubmit}>
                        用户名: <input onChange={this.saveFormData('username')} type="text" name="username" />
                        密码: <input onChange={this.saveFormData('password')} type="text" name="password" />
                        <button>登录</button>
                    </form>
                )
            }
        }
        /*
        总结:必须拿函数作为事件的回调
        saveFormData 就是高阶函数(a函数接收的参数或调用的返回值仍是一个函数就是高阶函数)
        函数的柯里化:通过函数调用继续返回函数的方式,实现多次接收参数最后统一处理的函数编码形式
        */
        //渲染组件
        ReactDOM.render(<Login />, document.getElementById('test'))
    </script>
</body>

</html>